package cn.edu.swu.dlx;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@WebServlet("/message") // 映射到 /message URL
public class MessageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 常量：用于在 ServletContext 中存储留言列表的 Key
    private static final String MESSAGE_LIST_KEY = "messageList";
    // 添加文件存储路径常量
    private static final String MESSAGE_FILE_PATH = "messages.txt";

    /**
     * 将留言列表保存到文件
     */
    private void saveMessagesToFile(List<Message> messageList) {
        try (PrintWriter writer = new PrintWriter(new FileWriter(MESSAGE_FILE_PATH, StandardCharsets.UTF_8, false))) {
            for (Message message : messageList) {
                // 格式：昵称|留言内容|时间戳
                writer.println(message.getName() + "|" + message.getContent() + "|" +
                        message.getTimestamp().format(String.valueOf(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
            }
        } catch (IOException e) {
            System.err.println("保存留言到文件失败: " + e.getMessage());
        }
    }

    /**
     * 从文件中加载留言
     */
    private List<Message> loadMessagesFromFile() {
        List<Message> messages = new ArrayList<>();
        File file = new File(MESSAGE_FILE_PATH);

        if (!file.exists()) {
            return messages;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(file, StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split("\\|", 3); // 分割成3部分，避免内容中有|符号
                if (parts.length == 3) {
                    Message message = new Message(parts[0], parts[1]);
                    messages.add(message);
                }
            }
        } catch (IOException e) {
            System.err.println("从文件加载留言失败: " + e.getMessage());
        }

        return messages;
    }

    /**
     * 【生命周期方法】在 Servlet 第一次初始化时调用
     * 用于初始化共享的留言列表
     */
    @Override
    public void init() throws ServletException {
        // 获取应用上下文对象
        ServletContext context = this.getServletContext();

        // 检查留言列表是否已存在（防止多次初始化）
        if (context.getAttribute(MESSAGE_LIST_KEY) == null) {
            // 使用 Collections.synchronizedList 确保线程安全（进阶点）
            List<Message> messageList = Collections.synchronizedList(new ArrayList<>());

            // 首先尝试从文件加载历史留言
            List<Message> loadedMessages = loadMessagesFromFile();
            if (!loadedMessages.isEmpty()) {
                messageList.addAll(loadedMessages);
                System.out.println("从文件加载了 " + loadedMessages.size() + " 条历史留言");
            } else {
                // 如果没有历史数据，则添加一个示例留言
                messageList.add(new Message("系统管理员", "欢迎使用留言板！请开始您的实验。"));
            }

            // 将列表存入应用范围 (ServletContext)
            context.setAttribute(MESSAGE_LIST_KEY, messageList);
            System.out.println("留言列表初始化完成，存储于 ServletContext。");
            System.out.println("Messages file path: " + new File(MESSAGE_FILE_PATH).getAbsolutePath());

        }
    }

    /**
     * 【核心】处理 HTTP POST 请求：接收并保存新留言
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置请求编码，处理中文乱码
        request.setCharacterEncoding("UTF-8");

        // 2. 获取 POST 参数
        String name = request.getParameter("name");
        String content = request.getParameter("message");

        // 简单的输入校验
        if (name != null && !name.trim().isEmpty() && content != null && !content.trim().isEmpty()) {

            // 3. 封装 Message 对象
            Message newMessage = new Message(name.trim(), content.trim());

            // 4. 获取共享的留言列表并添加新留言
            ServletContext context = this.getServletContext();
            @SuppressWarnings("unchecked")
            List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

            // 留言添加到列表的头部 (索引 0)，实现最新留言在上面
            messageList.add(0, newMessage);

            // 5. 保存到文件
            saveMessagesToFile(messageList);
        }

        // 6. 【关键】处理完数据后，重定向到 GET 请求，防止 F5 刷新导致重复提交
        response.sendRedirect("message");
    }

    /**
     * 【核心】处理 HTTP GET 请求：展示所有历史留言和输入表单
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置响应编码，确保输出的 HTML 页面正确显示中文
        response.setContentType("text/html;charset=UTF-8");

        // 2. 获取共享的留言列表
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

        // 3. 开始构建 HTML 响应
        response.getWriter().println("<!DOCTYPE html>");
        response.getWriter().println("<html><head><meta charset='UTF-8'><title>在线留言板 - 实验</title>");
        response.getWriter().println("<link rel='stylesheet' type='text/css' href='style.css'>");
        response.getWriter().println("</head><body>");
        response.getWriter().println("<div class='container'>");
        response.getWriter().println("<h1>留言板 (Servlet 实验)</h1>");

        // 4. 【展示表单】学生需在 index.html 中实现此表单，这里为了方便直接嵌入
        response.getWriter().println("<h2>留下您的印记</h2>");
        response.getWriter().println("<div class='message-form'>");
        response.getWriter().println("<form action='message' method='POST'>");
        response.getWriter().println("<label for='name'>昵称:</label>");
        response.getWriter().println("<input type='text' id='name' name='name' required placeholder='请输入您的昵称'>");
        response.getWriter().println("<label for='message'>留言:</label>");
        response.getWriter().println("<textarea id='message' name='message' rows='5' required placeholder='请输入您的留言'></textarea>");
        response.getWriter().println("<input type='submit' value='提交留言'>");
        response.getWriter().println("</form>");
        response.getWriter().println("</div>");

        response.getWriter().println("<hr>");

        // 5. 【展示历史留言】
        response.getWriter().println("<h2>历史留言 (" + messageList.size() + " 条)</h2>");
        response.getWriter().println("<table class='messages-table'>");
        response.getWriter().println("<tr><th width='20%'>昵称</th><th width='50%'>留言内容</th><th width='30%'>时间</th></tr>");

        // 遍历列表，动态生成表格行
        for (Message msg : messageList) {
            response.getWriter().println("<tr>");
            response.getWriter().println("<td><strong>" + msg.getName() + "</strong></td>");
            response.getWriter().println("<td>" + msg.getContent() + "</td>");
            response.getWriter().println("<td class='timestamp'>" + msg.getFormattedTimestamp() + "</td>");
            response.getWriter().println("</tr>");
        }

        response.getWriter().println("</table>");
        response.getWriter().println("</div></body></html>");
    }
}
